package com.xbongbong.paas.service;

import com.xbongbong.paas.pojo.vo.DuYanAccountResponseParamVO;
import com.xbongbong.paas.pojo.vo.DuYanAccountVO;
import com.xbongbong.paas.pojo.vo.DuYanAgentVO;
import com.xbongbong.paas.pojo.vo.DuYanCallLogResponseParamVO;
import com.xbongbong.paas.pojo.vo.DuYanCallLogVO;
import com.xbongbong.paas.pojo.vo.DuYanOrganizationVO;
import com.xbongbong.paas.pojo.vo.DuYanTeamVO;
import com.xbongbong.paas.pojo.vo.DuYanTranscriptionResponseVO;
import com.xbongbong.paas.toolbox.exception.XbbException;

import java.util.List;

/**
 * 度言http请求Service
 *
 * @author youli.chen
 * @mail nefeed@163.com
 * @time 2019-2-14 8:58
 */
public interface DuYanHttpService {

    /**
     * 注册企业
     *
     * @param name       企业全称，与工商注册名一致
     * @param alias      企业别名(3~8个字，必须含有中文字符)
     * @param registerId 统一信用代码
     * @return 注册成功的企业信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanOrganizationVO registerOrganization(String name, String alias, String registerId) throws XbbException;

    /**
     * 获取企业的apikey
     *
     * @param orgId 度言维护的企业id
     * @return String apikey
     * @throws XbbException 度言返回的错误由业务处理
     */
    String getOrgApiKey(Long orgId) throws XbbException;

    /**
     * 获取企业的apikey
     *
     * @param apiKey 企业的apikey，可通过获取企业apikey接口获取
     * @return String apikey
     * @throws XbbException 度言返回的错误由业务处理
     * @auth youli.chen
     */
    DuYanOrganizationVO getCompanyMsg(String apiKey) throws XbbException;

    /**
     * 获取企业的apikey
     *
     * @param apiKey             企业的apikey，可通过获取企业apikey接口获取
     * @param orgId              企业的orgId，企业Id
     * @param orgPhoneProtection 号码可见总开关
     * @return String apikey
     * @throws XbbException 度言返回的错误由业务处理
     * @auth youli.chen
     */
    String updateCompanyPhone(String apiKey, Long orgId, String orgPhoneProtection) throws XbbException;

    /**
     * 获取团队列表
     *
     * @param apiKey 企业的apikey，可通过获取企业apikey接口获取
     * @return List<DuYanTeamVO> 返回获取到的团队队列
     * @throws XbbException 度言返回的错误由业务处理
     */
    List<DuYanTeamVO> getTeamList(String apiKey) throws XbbException;

    /**
     * 创建团队
     *
     * @param apiKey 企业的apikey，可通过获取企业apikey接口获取
     * @param team   团队信息
     * @return DuYanTeamVO 团队信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanTeamVO registerTeam(String apiKey, DuYanTeamVO team) throws XbbException;

    /**
     * 修改团队
     *
     * @param apiKey 企业的apikey，可通过获取企业apikey接口获取
     * @param team   团队信息
     * @return DuYanTeamVO        团队信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanTeamVO updateTeam(String apiKey, DuYanTeamVO team) throws XbbException;

    /**
     * 团队详情
     *
     * @param apiKey 企业的apikey，可通过获取企业apikey接口获取
     * @param teamId 团队id
     * @return DuYanTeamVO        团队信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanTeamVO getTeamDetail(String apiKey, Long teamId) throws XbbException;

    /**
     * 获取坐席列表
     *
     * @param apiKey 企业的apikey，可通过获取企业apikey接口获取
     * @param teamId 团队编号
     * @return List<DuYanAgentVO> 返回获取到的团队队列
     * @throws XbbException 度言返回的错误由业务处理
     */
    List<DuYanAgentVO> getAgentList(String apiKey, String teamId) throws XbbException;

    /**
     * 获取企业员工列表
     *
     * @param apiKey   企业的apikey，可通过获取企业apikey接口获取
     * @param pageNum  页码
     * @param pageSize 每页个数
     * @param account  员工信息
     * @return DuYanAccountResponseParamVO 返回获取到的总页数，总数和员工列表
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanAccountResponseParamVO getAccountList(String apiKey, Integer pageNum,
                                               Integer pageSize, DuYanAccountVO account) throws XbbException;

    /**
     * 创建员工
     *
     * @param apiKey  企业的apikey，可通过获取企业apikey接口获取
     * @param account 员工信息
     * @return DuYanAccountVO 返回员工信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanAccountVO registerAccount(String apiKey, DuYanAccountVO account) throws XbbException;

    /**
     * 删除员工
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工的account_id
     * @return true：删除成功
     * @throws XbbException 度言返回的错误由业务处理
     */
    Boolean deleteAccount(String apiKey, String accountId) throws XbbException;

    /**
     * 获取员工信息
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工的account_id
     * @return DuYanAccountVO 返回获取的员工信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanAccountVO getAccount(String apiKey, String accountId) throws XbbException;

    /**
     * 修改员工信息
     *
     * @param apiKey  企业的apikey，可通过获取企业apikey接口获取
     * @param account 员工信息
     * @return DuYanAccountVO 员工信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanAccountVO updateAccount(String apiKey, DuYanAccountVO account) throws XbbException;

    /**
     * 设为坐席
     *
     * @param apiKey       企业的apikey，可通过获取企业apikey接口获取
     * @param accountId    员工编号
     * @param teamId       团队编号
     * @param isSupervisor 是否为团队管理员
     * @return DuYanAccountVO    员工信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanAccountVO setAgent(String apiKey, String accountId,
                            Long teamId, Boolean isSupervisor) throws XbbException;

    /**
     * 取消坐席
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工的account_id
     * @return DuYanAccountVO     员工信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanAccountVO deleteAgent(String apiKey, String accountId) throws XbbException;

    /**
     * 注册手机号码
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工编号
     * @param mobile    员工手机号码
     * @return DuYanAccountVO  员工信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanAccountVO registerMobile(String apiKey, String accountId, String mobile) throws XbbException;

    /**
     * 修改坐席团队
     *
     * @param apiKey       企业的apikey，可通过获取企业apikey接口获取
     * @param accountId    员工编号
     * @param teamId       坐席新的团队编号
     * @param isSupervisor 是否为团队管理员。true：团队管理员，false：普通坐席
     * @return DuYanAccountVO    员工信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanAccountVO updateAccountTeam(String apiKey, String accountId,
                                     Long teamId, Boolean isSupervisor) throws XbbException;

    /**
     * 删除团队坐席
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工编号
     * @param teamId    坐席新的团队编号
     * @return
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanAccountVO deleteAccountTeam(String apiKey, String accountId, Long teamId) throws XbbException;

    /**
     * 设为团队管理员
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工编号
     * @return DuYanAccountVO    员工信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanAccountVO setSupervisor(String apiKey, String accountId) throws XbbException;

    /**
     * 取消团队管理员
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工编号
     * @return DuYanAccountVO    员工信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanAccountVO cancelSupervisor(String apiKey, String accountId) throws XbbException;

    /**
     * 设为公司管理员
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工编号
     * @return DuYanAccountVO    员工信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanAccountVO setAdmin(String apiKey, String accountId) throws XbbException;

    /**
     * 取消公司管理员
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工编号
     * @return DuYanAccountVO    员工信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    DuYanAccountVO cancelAdmin(String apiKey, String accountId) throws XbbException;

    /**
     * 帮助用户进行登录，获取token
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工编号
     * @return DuYanAccountVO    带token的员工信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    String accountLogin(String apiKey, String accountId) throws XbbException;

    /**
     * 帮助管理员用户进行登录，获取token
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工编号
     * @return DuYanAccountVO    带token的员工信息
     * @throws XbbException 度言返回的错误由业务处理
     */
    String adminLogin(String apiKey, String accountId) throws XbbException;

    /**
     * 注册拨号号码（主要为了匿名拨号准备）
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工编号
     * @param target    要注册的目标号码，完整的手机或固定号码
     * @return boolean    注册拨打号码成功与否
     * @throws XbbException 度言返回的错误由业务处理
     * @author youli.chen
     * 创建时间：2017/11/8 上午11:17
     * 修改时间：
     * @version
     * @since 3.14
     */
    boolean registerCallPhoneNum(String apiKey, String accountId, String target) throws XbbException;

    /**
     * 获取注册的拨号号码（主要为了匿名拨号准备）
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工编号
     * @return
     * @throws XbbException
     */
    String getRegisteredCallPhoneNum(String apiKey, String accountId) throws XbbException;

    /**
     * 显示72小时的未接来电记录
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工编号
     * @param pageNum   页码
     * @param pageSize  每页个数
     * @return DuYanCallLogResponseParamVO    通话记录API的返回
     * @throws XbbException 度言返回的错误由业务处理
     * @author youli.chen
     * 创建时间：2017/11/14 下午午14:10
     * 修改时间：
     * @version
     * @since 3.14
     */
    DuYanCallLogResponseParamVO getAgentMissedCallLogList(String apiKey, String accountId, Integer pageNum, Integer pageSize)
            throws XbbException;

    /**
     * 获取企业的未接来电记录
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param pageNum   页码
     * @param pageSize  每页个数
     * @param startTime 查询开始时间，开始时间与结束时间不能超过一个月
     * @param endTime   查询结束时间，开始时间与结束时间不能超过一个月
     * @param teamId    团队ID， 非必填
     * @return DuYanCallLogResponseParamVO    通话记录API的返回
     * @throws XbbException 度言返回的错误由业务处理
     * @author youli.chen
     * 创建时间：2017/11/29 下午午05:30
     * 修改时间：
     * @version
     * @since 3.14
     */
    DuYanCallLogResponseParamVO getOrgMissedCallLogList(String apiKey, Integer pageNum, Integer pageSize, Long startTime,
                                                        Long endTime, Long teamId)
            throws XbbException;

    /**
     * 获取通话记录
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param pageNum   页码
     * @param pageSize  每页个数
     * @param startTime 查询开始时间，开始时间与结束时间不能超过一个月
     * @param endTime   查询结束时间，开始时间与结束时间不能超过一个月
     * @param teamId    团队ID， 非必填
     * @param memberId  坐席id，非必填
     * @param target    客户电话号码，非必填
     * @param codeId    电话类别，非必填
     * @return DuYanCallLogResponseParamVO 度言封装的通话记录
     * @throws XbbException 度言返回的错误由业务处理
     * @author youli.chen
     * 创建时间：2017/11/16 下午2:58
     * 修改时间：
     * @version
     * @since 3.14
     */
    DuYanCallLogResponseParamVO getCallLogList(String apiKey, Integer pageNum, Integer pageSize, Long startTime,
                                               Long endTime, Long teamId, Long memberId, String target, Long codeId)
            throws XbbException;

    /**
     * 获取通话记录
     *
     * @param apiKey   企业的apikey，可通过获取企业apikey接口获取
     * @param callUuid 唯一编码，可在cti的DYSDK.callEnd方法中返回得到。
     * @return DuYanCallLogVO 度言封装的通话记录
     * @throws XbbException 度言返回的错误由业务处理
     * @author youli.chen
     * 创建时间：2017/11/24 下午2:58
     * 修改时间：
     * @version
     * @since 3.14
     */
    DuYanCallLogVO getCallLogDetail(String apiKey, String callUuid) throws XbbException;

    /**
     * 直接根据度言的录音文件规则获取录音路径
     *
     * @param apiKey   企业apiKey
     * @param orgId    企业id
     * @param callTime 呼叫时间，yyyy-MM-dd的是 例如 2017-11-09
     * @param callUuid 度言维护的呼叫唯一码
     * @return String 路径地址
     * @throws XbbException 度言返回的错误由业务处理
     * @author youli.chen
     * 创建时间：2017/11/16 上午10:21
     * 修改时间：
     * @version
     * @since 3.14
     */
    String getRecordUrlStatic(String apiKey, String orgId, String callTime, String callUuid) throws XbbException;

    /**
     * 通过度言API获取度言的录音路径
     *
     * @param apiKey   企业apiKey
     * @param callUuid 度言维护的呼叫唯一码
     * @return String 路径地址
     * @throws XbbException 度言返回的错误由业务处理
     * @author youli.chen
     * 创建时间：2017/11/16 上午10:22
     * 修改时间：
     * @version
     * @since 3.14
     */
    String getRecordUrlDynamic(String apiKey, String callUuid) throws XbbException;

    /**
     * 移动端拨打电话前调此API注册目标号码
     *
     * @param apiKey    企业的apikey，可通过获取企业apikey接口获取
     * @param accountId 员工编号
     * @param target    要注册的目标号码，完整的手机或固定号码
     * @return String 用于用户手机直接拨打的号码
     * @throws XbbException 封装的异常信息
     * @author youli.chen
     * 创建时间：2017/12/1 下午4:38
     * 修改时间：
     * @version
     * @since 3.14.1
     */
    String registerMobileCallPhoneNum(String apiKey, String accountId, String target) throws XbbException;

    /**
     * 提交翻译任务
     *
     * @param apiKey   企业的apikey，可通过获取企业apikey接口获取
     * @param callUuid 通话录音唯一标识
     * @return DuYanTranscriptionResponseVO 封装的返回业务类
     * @throws XbbException 封装的异常信息
     * @author youli.chen
     * 创建时间：2018/3/12 下午2:53
     * 修改时间：
     * @version 3.19
     * @since 3.19
     */
    DuYanTranscriptionResponseVO postCallTranscription(String apiKey, String callUuid) throws XbbException;

    /**
     * 获取翻译结果
     *
     * @param apiKey          企业的apikey，可通过获取企业apikey接口获取
     * @param transcriptionId 翻译任务ID
     * @return DuYanTranscriptionResponseVO 封装的返回业务类
     * @throws XbbException 封装的异常信息
     * @author youli.chen
     * 创建时间：2018/3/12 下午2:53
     * 修改时间：
     * @version 3.19
     * @since 3.19
     */
    DuYanTranscriptionResponseVO getCallTranscription(String apiKey, String transcriptionId) throws XbbException;
}
